
package br.com.tcc.gp.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.tcc.gp.execoes.GestaoException;
import br.com.tcc.gp.modelo.Advogado;
import br.com.tcc.gp.modelo.Endereco;
import br.com.tcc.gp.util.DBConnector;

public class AdvogadoDAO extends PessoaDAO{
	
	Advogado advogado;
	
	private int linhas;
	private Connection conexao;
	private List<Advogado> listaAdv;
	private PreparedStatement preparedStatement;
		
	public static final String TABELA = "advogado";
	public static final String ID = "codigo";
	public static final String INSCRICAO_OAB = "inscricao_oab";
	public static final String SECCIONAL = "seccional";
	public static final String SUBSECAO = "subsecao";	
	public static final String CPF = "cpf";
	public static final String SEQUENCIA = "seq_advogado";
	public static final String ID_ENDERECO = "id_endereco";
	
	public static final String CODENDERECO = "codigo";
	public static final String ENDERECO= "endereco";
	public static final String CIDADE = "cidade";
	public static final String CEP = "cep";
	public static final String EMAIL = "email";
	public static final String FONE1 = "fone1";
	public static final String FONE2 = "fone2";
		
	public AdvogadoDAO() {
		listaAdv = new ArrayList<Advogado>();
		try {
			conexao = DBConnector.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("Conexao Falhou");
		}
		
	}
	
	public int salvar(Advogado advogado, int p) throws GestaoException {
		try {							 		
				String sql = "INSERT INTO ADVOGADO (CODIGO, ID_PESSOA, SECCIONAL, SUBSECAO, INSCRICAO_OAB)"
						+ " VALUES (" + SEQUENCIA + ".nextval, ? , ?, ?, ? )";
				preparedStatement = conexao.prepareStatement(sql);
				preparedStatement.setInt(1, p);
				preparedStatement.setString(2, advogado.getSeccional());
				preparedStatement.setString(3, advogado.getSubsecao());
				preparedStatement.setString(4, advogado.getInscricaoOab());
				linhas = preparedStatement.executeUpdate();
				conexao.commit();
				return linhas;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		return 0;

	}
	
	public Advogado pesquisar(String inscricao) {
		try {
			String sql = "SELECT a." + ID + ", a." + SUBSECAO + ", a."+ SECCIONAL + ", a." + INSCRICAO_OAB + ", p."+ID_ENDERECO +", p." + CPF
					+ ", p." + NOME + ", p." + RG + ", p." + SEXO +" FROM advogado a join pessoa p on a.id_pessoa = p.codigo "
							+ " WHERE inscricao_oab = ? or p.cpf = ? or p.rg = ?";

			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setString(1, inscricao);
			preparedStatement.setString(2, inscricao);	
			preparedStatement.setString(3, inscricao);	
			ResultSet resultado = preparedStatement.executeQuery();
			Advogado advogado = new Advogado();
			
			while (resultado.next()) {				
				advogado.setCodigo(resultado.getInt(ID));
				advogado.setNome(resultado.getString(NOME));
  				advogado.setCpf(resultado.getString(CPF));
  				advogado.setRg(resultado.getString(RG));
  				advogado.setSexo(resultado.getString(SEXO));
				advogado.setSubsecao(resultado.getString(SUBSECAO));
				advogado.setSeccional(resultado.getString(SECCIONAL));
				advogado.setInscricaoOab(resultado.getString(INSCRICAO_OAB));
				Endereco endereco = new Endereco();
    			endereco.setCodigo(resultado.getInt(ID_ENDERECO));
    			advogado.setEndereco(endereco);
			}
			return advogado;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		return null;
	}
	
	public int deletar(Advogado adv) {
		try {
			String sql = "DELETE FROM advogado WHERE codigo = ? ";
			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setInt(1, adv.getCodigo());
			linhas = preparedStatement.executeUpdate();
			conexao.commit();
			return linhas;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
		return 0;
	}
	
	
	public List<Advogado> listar(){		
		try {
			String sql = "SELECT a." + ID + ", a." + SUBSECAO + ", a."+ SECCIONAL + ", a." + INSCRICAO_OAB +
					", p." + CPF+ ", p." + NOME + ", p." + RG + ", p." + SEXO + 
					", e."+CODENDERECO+", e."+ENDERECO+", e."+CIDADE+", e."+CEP+", e."+FONE1+", e."+FONE2+", e."+EMAIL+
					" FROM advogado a join pessoa p on a.id_pessoa = p.codigo "+
						"join endereco e on p.id_endereco = e.codigo ";	

			preparedStatement = conexao.prepareStatement(sql);
			ResultSet resultado = preparedStatement.executeQuery();
			Advogado advogado ;
			
			while (resultado.next()) {
				advogado = new Advogado();
				advogado.setCodigo(resultado.getInt(ID));
				advogado.setNome(resultado.getString(NOME));
  				advogado.setCpf(resultado.getString(CPF));
  				advogado.setRg(resultado.getString(RG));
  				advogado.setSexo(resultado.getString(SEXO));
				advogado.setSubsecao(resultado.getString(SUBSECAO));
				advogado.setSeccional(resultado.getString(SECCIONAL));
				advogado.setInscricaoOab(resultado.getString(INSCRICAO_OAB));
				
				Endereco endereco = new Endereco();
    			endereco.setCodigo(resultado.getInt(CODENDERECO));
    			endereco.setCep(resultado.getString(CEP));
    			endereco.setCidade(resultado.getString(CIDADE));
    			endereco.setEmail(resultado.getString(EMAIL));
    			endereco.setFone1(resultado.getString(FONE1));
    			endereco.setFone2(resultado.getString(FONE2));    			
    			advogado.setEndereco(endereco);
    			listaAdv.add(advogado);
			}			
			return listaAdv;
		} catch (SQLException sqlException) {
			sqlException.printStackTrace();
		}
	return null;
	}
	
	public int alterar(Advogado advogado) {
		try {							 		
			String sql = "UPDATE advogado SET seccional = ?, subsecao = ?, inscricao_oab = ? WHERE CODIGO = ?";
			preparedStatement = conexao.prepareStatement(sql);
			preparedStatement.setString(1, advogado.getSeccional());
			preparedStatement.setString(2, advogado.getSubsecao());
			preparedStatement.setString(3, advogado.getInscricaoOab());
			preparedStatement.setInt(4, advogado.getCodigo());
			linhas = preparedStatement.executeUpdate();
			conexao.commit();
			return linhas;
	} catch (SQLException sqlException) {
		sqlException.printStackTrace();
	}
	return 0;
	}
	
}